<?php

/**
 * Classe Abstrata Modelo
 * toda entidade que sera persistida no banco de dados
 * deve estender esta classe
 * 
 * @author Cristiano M. Gomes <cmgomes.es@gmail.com>
 */
abstract class Modelo extends Doctrine_Record {

	/**
	 * Método para configuração dos campos que a tabela deve ter
	 *
	 */
    public function setTableDefinition() {
        $this->hasColumn('data_criacao', 'timestamp');
        $this->hasColumn('data_modificacao', 'timestamp');
        $this->hasColumn('deletado',  'boolean');
        $this->hasColumn('publicado',  'boolean', array('default' => 0));
    }

    /**
     * Configurações adicionais como por exemplo
     * como o sistema irá deletar os registros do banco de dados
     */
    public function setUp() {
        $this->actAs('SoftDelete');
    }

    /**
     * Retorna o id da entidade
     */
    public function get_id() {
        return current($this->identifier());
    }

    /**
     * Define o valor da data de criacao da entidade
     * @param string $date
     */
    public function set_data_criacao($date) {
        $this->data_criacao = $date;
    }

    /**
     * Retorna o valor da data de criacao da entidade
     * @return string
     */
    public function get_data_criacao() {
        return $this->data_criacao;
    }

    /**
     * Define o valor da data de modificacao da entidade
     * @param string $date
     */
    public function set_data_modificacao($date) {
        $this->data_modificacao = $date;
    }

    /**
     * Retorna o valor da data de modificacao da entidade
     * @return string
     */
    public function get_data_modificacao() {
        return $this->data_modificacao;
    }
    
    /**
     * Define se entidade esta removida ou nao
     * @param boolean $deleted
     */
    public function set_deletado($deletado) {
        $this->deletado = ($deletado == true);
    }

    /**
     * Retorna se a entidade esta removida ou nao
     * @return boolean
     */
    public function get_deletado() {
        return ($this->deletado == true);
    }

    /**
     * Define se a entidade esta publicada ou nao
     * @param boolean $published
     */
    public function set_publicado($publicado) {
        $this->publicado = ($publicado == true);
    }

    /**
     * Retorna se a entidade esta publicada ou nao
     * @return boolean
     */
    public function get_publicado() {
        return ($this->publicado == true);
    }

    /**
     * Retorna o hash representando a entidade
     * @return int
     */
    public function hash_code() {
        return hash($this->id);
    }

    /**
     * Retorna uma String indentificando a entidade
     * @return String
     */
    public function to_string() {
        return get_class($this) . "[{$this->id}]";
    }
    
}
